package com.camartsApp.Util;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;
/**
 * @version .......
 * @创建时间 2025/6/12  下午6:52
 * @创建者 玉苏甫江
 */
@Component
public class RedisUtil {

	@Autowired
	private StringRedisTemplate stringRedisTemplate;

	// ====== String类型操作（用于token等场景）======

	/**
	 * 存储键值对（带过期时间，单位：秒）
	 */
	public void set(String key, String value, long timeout) {
		stringRedisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);
	}

	/**
	 * 存储键值对（无过期时间）
	 */
	public void set(String key, String value) {
		stringRedisTemplate.opsForValue().set(key, value);
	}

	/**
	 * 获取键对应的值
	 */
	public String get(String key) {
		return stringRedisTemplate.opsForValue().get(key);
	}

	/**
	 * 删除指定key
	 */
	public boolean delete(String key) {
		return Boolean.TRUE.equals(stringRedisTemplate.delete(key));
	}

	/**
	 * 判断key是否存在
	 */
	public boolean hasKey(String key) {
		return Boolean.TRUE.equals(stringRedisTemplate.hasKey(key));
	}

	/**
	 * 设置key过期时间（单位：秒）
	 */
	public boolean expire(String key, long timeout) {
		return Boolean.TRUE.equals(stringRedisTemplate.expire(key, timeout, TimeUnit.SECONDS));
	}

	/**
	 * 获取key的剩余过期时间（单位：秒），-1为永久有效，-2为key不存在
	 */
	public long getExpire(String key) {
		Long expire = stringRedisTemplate.getExpire(key, TimeUnit.SECONDS);
		return expire == null ? -1 : expire;
	}

	// ====== Hash类型操作（仅用于实际项目有hash数据结构需求时）======

	/**
	 * 存储Hash键值对（无过期时间）
	 */
	public void hset(String hash, String field, String value) {
		stringRedisTemplate.opsForHash().put(hash, field, value);
	}

	/**
	 * 存储Hash键值对（带hash整体过期时间，单位：秒）
	 */
	public void hset(String hash, String field, String value, long timeout) {
		stringRedisTemplate.opsForHash().put(hash, field, value);
		stringRedisTemplate.expire(hash, timeout, TimeUnit.SECONDS);
	}

	/**
	 * 获取Hash指定field的值
	 */
	public String hget(String hash, String field) {
		Object val = stringRedisTemplate.opsForHash().get(hash, field);
		return val == null ? null : val.toString();
	}

	/**
	 * 删除Hash中的指定field
	 */
	public void hdel(String hash, String field) {
		stringRedisTemplate.opsForHash().delete(hash, field);
	}

	/**
	 * 判断Hash中是否存在指定field
	 */
	public boolean hHasKey(String hash, String field) {
		return Boolean.TRUE.equals(stringRedisTemplate.opsForHash().hasKey(hash, field));
	}

	/**
	 * 获取Hash中field的数量
	 */
	public long hsize(String hash) {
		Long size = stringRedisTemplate.opsForHash().size(hash);
		return size == null ? 0 : size;
	}
}